/**
 * @file main.cpp
 * @brief ESP32-S3主程序文件
 * @details 实现WiFi连接、OTA更新和LED指示功能
 */

#include <Arduino.h>
#include "OTAUpdate.h"
#include "WIFILib.h"
#include "config.h"
#include <NeoPixelBus.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/event_groups.h>
#include <freertos/semphr.h>

// LED配置
#define LED_PIN 48      ///< LED引脚号
#define NUM_LEDS 1      ///< LED数量

// 全局对象
NeoPixelBus<NeoGrbFeature, NeoEsp32Rmt2Ws2812xMethod> strip(NUM_LEDS, LED_PIN);  ///< LED灯带控制对象


///< WiFi连接管理对象
WIFILib wifi(WIFI_SSID, WIFI_PASSWORD);                                          ///< WiFi连接管理对象

///< OTA更新管理对象
OTAUpdate ota(WIFI_SSID, WIFI_PASSWORD, OTA_UPDATE_SERVER, OTA_VERSION_CHECK_URL, FIRMWARE_VERSION);  

// FreeRTOS任务句柄
TaskHandle_t wifiTaskHandle = NULL;   ///< WiFi任务句柄
TaskHandle_t otaTaskHandle = NULL;    ///< OTA任务句柄
TaskHandle_t mainTaskHandle = NULL;   ///< 主任务句柄

/**
 * @brief WiFi任务函数
 * @param pvParameters 任务参数，指向WIFILib实例
 * @details 负责维护WiFi连接
 */
void wifiTask(void *pvParameters) {
    WIFILib* wifiInstance = (WIFILib*)pvParameters;
    wifiInstance->startWiFiTask();
    vTaskDelete(NULL);
}

/**
 * @brief OTA任务函数
 * @param pvParameters 任务参数，指向OTAUpdate实例
 * @details 负责检查和处理固件更新
 */
void otaTask(void *pvParameters) {
    OTAUpdate* otaInstance = (OTAUpdate*)pvParameters;
    otaInstance->startOTATask();
    vTaskDelete(NULL);
}

/**
 * @brief 主任务函数
 * @param pvParameters 任务参数（未使用）
 * @details 控制LED指示灯闪烁
 */
void mainTask(void *pvParameters) {
    while (1) {
        strip.SetPixelColor(0, RgbColor(255, 0, 0));  // 设置LED为红色
        strip.Show();
        vTaskDelay(pdMS_TO_TICKS(500));
        strip.SetPixelColor(0, RgbColor(0, 0, 0));    // 关闭LED
        strip.Show();
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

/**
 * @brief 系统初始化函数
 * @details 初始化串口、LED，创建并启动各个任务
 */
void setup() {
    // 初始化串口
    Serial.begin(115200);
    Serial.println("系统初始化...");
    
    // 初始化LED
    strip.Begin();
    strip.Show();
    
    // 创建任务
    // WiFi任务运行在核心1
    xTaskCreatePinnedToCore(wifiTask, "WiFiTask", 8192, &wifi, 1, &wifiTaskHandle, 1);
    // OTA任务运行在核心0    
    xTaskCreatePinnedToCore(otaTask, "OTATask", 8192, &ota, 1, &otaTaskHandle, 0);
    // 主任务运行在核心0     
    xTaskCreatePinnedToCore(mainTask, "MainTask", 8192, NULL, 1, &mainTaskHandle, 0);
    
    Serial.println("系统初始化完成");
}

/**
 * @brief 主循环函数
 * @details 保持系统运行，处理低优先级任务
 */
void loop() {
    vTaskDelay(pdMS_TO_TICKS(1000));
}